import java.util.Stack;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.calculate("9"));
    }

    public int calculate(String s) {
        /**
         * 基本计算器Ⅱ
         * 思路：
         *  先乘除后加减，使用两次栈操作
         * 对该暴力模拟总结：
         *  思路比较直接，但是需要注意的细节很多，若是没有足够多的测试案例，则很大可能无法做出来
         *  */
        // 1 预处理
        Stack<String> stack = new Stack<>();
        s = s.replaceAll(" ", "");
        
        // 2 先处理乘除
        StringBuilder tempVal = new StringBuilder();
        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '*' || s.charAt(i) == '/') {
                // 为乘除
                // -记录前置操作数（若是tempVal为空，说明是连续加减）
                String firstVal = tempVal.length() == 0 ? stack.pop() : tempVal.toString();
                tempVal = new StringBuilder();

                // -寻找后置操作数
                int cur = i+1;
                while(cur < s.length() && s.charAt(cur) >= '0' && s.charAt(cur) <= '9') {
                    cur ++;
                }
                String lastVal = s.substring(i+1, cur);

                // -将处理结果入队
                if(s.charAt(i) == '*') {
                    stack.push(String.valueOf(Integer.parseInt(firstVal) * Integer.parseInt(lastVal)));
                } else {
                    stack.push(String.valueOf(Integer.parseInt(firstVal) / Integer.parseInt(lastVal)));
                }

                // -更新i
                i = cur-1;
            } else if(s.charAt(i) == '+' || s.charAt(i) == '-') {
                // 为加减（将前数字入栈 并 入栈操作符）
                stack.push(tempVal.toString());
                tempVal = new StringBuilder();
                stack.push(String.valueOf(s.charAt(i)));
            } else {
                // 非操作符时累加
                tempVal.append(s.charAt(i));
            }
        }
        if(tempVal.length() != 0) {
            stack.push(tempVal.toString());
        }

        // 3 再处理加减
        int answer = 0;
        tempVal = new StringBuilder();
        while(!stack.isEmpty()) {
            String curPop = stack.pop();
            if(curPop.equals("+")) {
                answer += Integer.parseInt(tempVal.toString());
                tempVal = new StringBuilder();
            } else if(curPop.equals("-")) {
                answer -= Integer.parseInt(tempVal.toString());
                tempVal = new StringBuilder();
            }else {
                tempVal = new StringBuilder(curPop);
            }
        }
        answer += Integer.parseInt(tempVal.toString());
        return answer;
    }
}
